package org.pine.dictionary.service;

import jakarta.servlet.http.HttpServletResponse;
import org.pine.dictionary.bean.PageRequest;
import org.pine.dictionary.bean.PageResponse;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.Serializable;
import java.util.List;

/**
 * <p>
 * 基础服务接口
 * </p>
 *
 * @author pine
 * @since 2024-05-15
 */
public interface BaseService<ID extends Serializable, EntityBo, Query, SaveRequest, QueryRequest, QueryResponse> {
    /**
     * 新增
     *
     * @param request 请求
     */
    void insert(SaveRequest request);

    /**
     * 按业务ID更新
     *
     * @param request 请求
     */
    void update(SaveRequest request);

    /**
     * 按业务ID列表批量删除
     *
     * @param idList id 列表
     */
    void delete(List<ID> idList);

    /**
     * 按业务ID查信息
     *
     * @param id 业务id
     * @return 响应
     */
    QueryResponse getDetail(ID id);

    /**
     * 查询信息（分页）
     *
     * @param request 请求
     * @return PageResponse 响应
     */
    PageResponse<QueryResponse> list(PageRequest<QueryRequest> request);

    /**
     * 启用
     *
     * @param idList id 列表
     */
    default void enable(List<ID> idList) {
        throw new UnsupportedOperationException();
    }

    /**
     * 禁用
     *
     * @param idList id 列表
     */
    default void disable(List<ID> idList) {
        throw new UnsupportedOperationException();
    }

    /**
     * 导入
     */
    default void importExcel(MultipartFile file) {
        throw new UnsupportedOperationException();
    }

    /**
     * 获取导入模版
     */
    default void importTpl(HttpServletResponse response) {
        throw new UnsupportedOperationException();
    }

    /**
     * 导出
     */
    default void export(HttpServletResponse response, QueryRequest request) throws IOException {
        throw new UnsupportedOperationException();
    }


    /**
     * 转换 Response，转换之后的数据直接返回给客户端
     *
     * @param entityBo 业务实体类
     * @return response
     */
    QueryResponse transformToResponse(EntityBo entityBo);

    /**
     * 将请求 request 转换成 manager 的 query 对象
     *
     * @param request 请求参数
     * @return query 对象
     */
    PageRequest<Query> transformToQuery(PageRequest<QueryRequest> request);

    /**
     * 将请求 request 转换成实体类，转换之后的数据保存到数据库中
     *
     * @param request 保存请求vo
     * @return 实体
     */
    EntityBo transformToEntity(SaveRequest request);

    default void checkForInsert(EntityBo entityBo) {
    }

    default void checkForUpdate(EntityBo entityBo) {
    }
}
